package top.wuyang.trywork.exception;

import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DataAccessException;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.resource.NoResourceFoundException;
import top.wuyang.trywork.base.R;

import java.sql.SQLException;

/**
 * 全局统一异常处理器
 * @author wuyang
 */

@Slf4j
// @ControllerAdvice 控制器拦截器，所有控制器的方法都会被本类拦截
@ControllerAdvice
public class AppExceptionHandler {

    // @ExceptionHandler 是异常处理器，当控制器抛出对应类型的异常时会触发本方法
    @ExceptionHandler(Exception.class)
    // @ResponseBody 表示应答结果是json格式返回
    @ResponseBody
    public R<String> handleException(Exception ex){
        log.error("全局异常处理器捕获到异常",ex);
        return R.fail("程序发生异常，请联系管理员",null);
    }


    @ExceptionHandler(DataAccessException.class)
    @ResponseBody
    public R<String> handleException(DataAccessException ex){
        log.error("数据库操作发生异常",ex);
        return R.fail("数据异常，请联系管理员",null);
    }

    @ExceptionHandler(SQLException.class)
    @ResponseBody
    public R<String> handleException(SQLException ex){
        log.error("数据库语句发生异常",ex);
        return R.fail("数据库语句发生异常，请联系管理员",null);
    }

    @ExceptionHandler(NoResourceFoundException.class)
    @ResponseBody
    public R<String> handleException(NoResourceFoundException ex){
        log.error("请求地址错误",ex);
        return R.fail("请求地址错误，请联系管理员",null);
    }

    @ExceptionHandler(HttpMessageNotReadableException.class)
    @ResponseBody
    public R<String> handleException(HttpMessageNotReadableException ex){
        log.error("提交格式不正确",ex);
        return R.fail("提交格式不正确",null);
    }



}
